struct ColoredShape: Shape{
Shape& shape;
string color;
ColoredShape(Shape& shape, const string& color): shape(shape), color(color) {}
string str() const override {
ostringstream oss;
oss<shape.str()<<" has the color "<<color;
return oss.str();
}
};
struct TransparentShape: Shape{
Shape& shape;
uint8_t transparency;
TransparentShape(Shape& shape, const uint8_t transparency): shape(shape), transparency(transparency) {}
strint str() const override {
osstringstream oss;
oss<shape.str()<<" has "<<static_cast<float>(transparency)/255.f*100.f<<"% transparency";
return oss.str()
}
}
Circle circle{0.5f};
ColoredShape redCircle{circle, "red"};
cout<<redCircle.str();
Square square{3};
TransparentShape demiSquare{square, 85};
cout<<demiSquare.str();
컴포지트를 이용하면, 적용할 도형 인스턴스를 이용해서 기능을 확장할 수 있다.
아래와 같이 ColoredShape와 TransparentShape를 합성해서 사용할 수 있다.
TransparentShape myCircle{ColoredShape{Circle{23}, "green"}, 64};
cout<<myCircle.str();
하지만, 위에서 구현한 데코레이터는 비상식적인 합성에 대해 에러를 출력하지 않는다.
ColoredShape{ColoredShape{}};
ColoredShape{TransparentShape{ColoredShape{}}};